home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / shell / d_poff / src / d_poff.c next >
Encoding:
C/C++ Source or Header  |  1995-05-24  |  6.3 KB  |  278 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <egb.h>
  9. #include <guidbg.h>
  10.  
  11. //#include <mos.h>
  12. #include <eintm.h>
  13. #include <KH.h>
  14. #include <dlib.h>
  15. //#include <file_dlg.h>
  16.  
  17. //#define DEBUG
  18.  
  19. char    *guiEgbPtr ;            /*    EGB のワークアドレス    */
  20.  
  21. int    dialogID = -1 ;
  22. int    iconBaseDialogID = -1 ;
  23. int    poffIconID[2] = -1 ;
  24. int    messageID[2] = -1 ;
  25.  
  26. /*= リジューム用設定=================================================*/
  27. FRAME    RSM_FRAME;
  28. char    RSMID[]="%%% Dangerous poff %%%";
  29. char    RSMTITLE[]="Dangerous poff                  By 機拡";
  30.  
  31. int userFunc(apliId, messId, info, data)
  32. int    apliId;
  33. int    messId;
  34. int    info;
  35. int    data;
  36. {
  37.     register int    ret;
  38.  
  39.     ret = ILLEGAL_FUNCTION;
  40.  
  41.     switch(messId)
  42.     {
  43.         case    GM_QUIT :
  44.             MMI_SetHaltFlag(TRUE);
  45.             ret = NOERR ;
  46.             break;
  47.     }
  48.  
  49.     return(ret);
  50. }
  51.  
  52. void main()
  53. {
  54.     static MMICTRL mmi ={
  55.                 SCREEN16|SCREENIGNORE,        // ページ0側解像度
  56.                 SCREENUNUSED,                // ページ1側解像度
  57.                 0,                             // 書き込みページ
  58.                 SCREENAVAILABLE,             // 表示ページ
  59.                 0,                             // 表示プライオリティ
  60.                 SCREENAVAILABLE,            // 色数
  61.                 SCREENEXPAND,                 // VRAMの横の長さ
  62.                 0,                             // メモリ領域の大きさ
  63.                 NULL,                         // メモリ領域のアドレス
  64.                 0,                             // ユーザ領域の大きさ
  65.                 NULL,                         // ユーザ領域のアドレス
  66.                 0, 0,                         // 画面枠    lupx,lupy
  67.                 0, 0,                        //            rdwx,rdwy
  68.                 -16384, -16384,                // 移動枠    lupx,lupy
  69.                 16383, 16383,                //            rdwx,rdwy
  70.                 15,                         // 白色
  71.                 8,                          // 黒色
  72.                 7,                          // 灰色
  73.                 6                             // 反転色
  74.     };
  75.  
  76.     extern int APL_init() ;
  77.  
  78.     /*    初期化処理    */
  79.     if (MMI_Open( &mmi ) == NOERR)
  80.     {
  81.         /*    初期化に成功すればメインループに入る.    */
  82.         if (APL_init() == NOERR)
  83.         {
  84.             MMI_ExecSystem() ;
  85.             APL_end();
  86.         }
  87.     }
  88.  
  89.     /*    終了処理    */
  90.     MMI_Close() ;
  91.  
  92. }
  93.  
  94. int APL_init()
  95. {
  96.     extern MMIINIT    initDataGUI ;
  97.  
  98.     int    ret,mret,mptr ;
  99.  
  100.     mret = MG_PushPtr(MB_WAIT,&mptr);        //    MB_WAIT==目覚まし時計
  101.  
  102.     /*    EGB ワークアドレスの取得.    */
  103.     guiEgbPtr = MMI_GetEgbPtr() ;
  104.  
  105.     /*    ユーザアイコン設定        */
  106.     extern unsigned char *iconTbl[];
  107.     extern int iconMaxId;
  108.     MMI_SetIconTable(iconTbl, iconMaxId);
  109.  
  110.     /*    ハイパ型部品の初期化            */
  111.     if ((ret = MMI_initHyper()) < 0)
  112.         return ret ;
  113.     /*    ダイアログ型部品の初期化        */
  114.     if ((ret = MMI_initDialogL40()) < 0)
  115.         return ret ;
  116.     /*    メッセージ型部品の初期化        */
  117.     if ((ret = MMI_initMessageL40()) < 0)
  118.         return ret ;
  119.     /*    ボタン型部品の初期化            */
  120.     if ((ret = MMI_initButtonL40()) < 0)
  121.         return ret ;
  122.     /*    アイコンボタン型部品の初期化    */
  123.     if ((ret = MMI_initIconL40()) < 0)
  124.         return ret ;
  125.  
  126.     /*    背景データの初期化                        */
  127.  
  128.     /*    データの登録        */
  129.     if ((ret = MMI_Init(&initDataGUI)) < 0)
  130.         return ret ;
  131.  
  132.     //    Tmenuにパレットを合わせる
  133.     KH_initGuiColor();
  134.  
  135.     ICNInit(0);
  136.  
  137.     /*----------------------------------------------------------------*/
  138.     /*  リジューム読み込み (※のついた処理は必ず行ってください)       */
  139.     /*----------------------------------------------------------------*/
  140.     char    work[RSMWORKSIZE];    // リジュームマネージャのワークエリア
  141.     char    buf[250];
  142.     char    *ptr;
  143.     int        size, x, y;
  144.     HYPER    hyp;
  145.  
  146.     // リジュームマネージャの初期化
  147.     EIN_rsmInit( work, RSMID );
  148.     // 読み込みバッファ設定
  149.     EIN_rsmBufSet( work, buf, 250 );
  150.     // リジューム情報読み込み
  151.     size = EIN_rsmLoad( work );
  152.     #ifdef DEBUG
  153.     printf(" resume size(%d)\n",size);
  154.     #endif
  155.     if ( size > 0 ){
  156.         // 表示位置
  157.         if ( ((ptr = strstr(buf,"\nPANEL: ")) != NULL ) &&
  158.              (sscanf(ptr,"\nPANEL: %d %d\n", &x, &y) > 1 ) ){
  159.             // 枠座標を得る
  160.             MMI_SendMessage( dialogID, MM_GETHYPER, 1, &hyp );
  161.             RSM_FRAME.lupx = x;
  162.             RSM_FRAME.lupy = y;
  163.             RSM_FRAME.rdwx = x+(hyp.fr.rdwx-hyp.fr.lupx);
  164.             RSM_FRAME.rdwy = y+(hyp.fr.rdwy-hyp.fr.lupy);
  165.             #ifdef DEBUG
  166.             printf("PANEL: move to (%d,%d)\n", x, y);
  167.             #endif
  168.             MMI_SendMessage( dialogID, MM_MOVE, 1, &RSM_FRAME ) ;
  169.         }
  170.     } else {
  171.         #ifdef DEBUG
  172.         printf("Can't find resume file.\n");
  173.         #endif
  174.     }
  175.  
  176.     /*    背景を表示する                            */
  177.     MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;
  178.  
  179.     MMI_SendMessage(MMI_GetBaseObj(), MM_SETEXEC, 1, userFunc);
  180.     MMI_CallMessage(MMI_GetApliId(), GM_TITLE, (int)RSMTITLE, 0);
  181.  
  182.     //    アイドルタスク登録
  183.     extern void    userIdleTask();
  184.     MMI_SetIdleTaskFunc( userIdleTask );
  185.  
  186.     if(mret==0) MG_PopPtr( mptr );
  187.  
  188.     return NOERR ;
  189. }
  190.  
  191. int APL_end()
  192. {
  193.     int mret,mptr;
  194.  
  195.     mret = MG_PushPtr(MB_WAIT,&mptr);        //    MB_WAIT==目覚まし時計
  196.  
  197.     ICNTerm();
  198.  
  199.     /*===================================================================*/
  200.     /* リジューム情報更新 (※がついた処理は必ず行って下さい)             */
  201.     /*===================================================================*/
  202.     char    work[RSMWORKSIZE];
  203.     char    buf[250];
  204.     char    aplpath[128];
  205.     HYPER    hyp;
  206.     register int ret;
  207.     
  208.     // 枠座標を得る
  209.     MMI_SendMessage( dialogID, MM_GETHYPER, 1, &hyp );
  210.     
  211.     // 移動していたらセーブ
  212.     if ( (RSM_FRAME.lupx  != hyp.fr.lupx) ||
  213.          (RSM_FRAME.lupy  != hyp.fr.lupy) ){
  214.         // マネージャ初期化
  215.         EIN_rsmInit( work, RSMID );
  216.         // バッファ設定(アプリ識別ID,更新時刻は自動設定されます)
  217.         EIN_rsmBufSet( work, buf, 250 );
  218.         // アプリディレクトリ保存
  219.         MMI_CallMessage( MMI_GetApliId(), GM_QUERYID, QM_PATH, (int)aplpath );
  220.         EIN_rsmBufPrintf( work, "APLPATH: %s", aplpath );
  221.         // アプリ名保存
  222.         EIN_rsmBufPrintf( work, "TITLE:   %s", RSMTITLE );
  223.         // コメント保存
  224.         EIN_rsmBufCat( work, "COMMENT: デンジャラスパワーオフ!!!");
  225.         // アイコン位置保存
  226.         EIN_rsmBufPrintf( work, "PANEL: %d %d", hyp.fr.lupx, hyp.fr.lupy );
  227.         // バッファ終端(^A)設定
  228.         EIN_rsmBufTail( work );
  229.         // バッファをセーブ
  230.         ret = EIN_rsmSave( work );
  231.         #ifdef DEBUG
  232.         printf(" resume save size(%d)   ptr:(%d,%d)\n",ret, hyp.fr.lupx, hyp.fr.lupy);
  233.         #endif
  234.     }
  235.  
  236.     if(mret==0) MG_PopPtr( mptr );
  237.  
  238.     return NOERR ;
  239. }
  240.  
  241. int number = 0;
  242. int icon[12] = {513,
  243.                 514,
  244.                 515,
  245.                 516,
  246.                 517,
  247.                 518,
  248.                 519,
  249.                 518,
  250.                 517,
  251.                 516,
  252.                 515,
  253.                 514};
  254.  
  255. void userIdleTask(void)
  256. {
  257.     if(number<11) ++number; else number=0;
  258.     MMI_SendMessage(poffIconID[1],MM_SETSHAPE,1,icon[number]);
  259.     MMI_SendMessage(poffIconID[1],MM_SHOW,0);
  260.  
  261.     return ;
  262. }
  263.  
  264. /*    initDataGUI:poffIconID[0]:MJ_ICONL40の呼び出し関数    */
  265. int    poffFunc(kobj, messId, argc, pev, trigger)
  266. int        kobj ;
  267. int        messId ;
  268. int        argc ;
  269. EVENT    *pev ;
  270. int        trigger ;
  271. {
  272.     //    dangerous poff
  273.     _outb(0x22,0x40);
  274.  
  275.     //    returnする事はないけど・・・
  276.     return NOERR ;
  277. }
  278.